import axios from 'axios';
import { ElMessage } from 'element-plus';
import { getToken } from '@/utils/token.js';
import router from '@/router/index.js';
import { removeToken } from '@/utils/token.js';
import { useUserStore } from '@/store/modules/user.js';
// 创建请求实例
const instance = axios.create({
	baseURL: import.meta.env.MODE === 'development' ? '/api' : '',
	// 指定请求超时的毫秒数
	timeout: 10000,
	// 表示跨域请求时是否需要使用凭证
	withCredentials: false,
});

// 前置拦截器（发起请求之前的拦截）
instance.interceptors.request.use(
	(config) => {
		/**
		 * 在这里一般会携带前台的参数发送给后台，比如下面这段代码：
		 * const token = getToken()
		 * if (token) {
		 *  config.headers.token = token
		 * }
		 */

		const useUser = useUserStore();
		if (config.data instanceof FormData) {
			// 直接通过 append 方法添加字段
			config.data.append('expire_time', useUser.userInfo.expire_time);
		  } else {
			// 普通对象则正常合并
			config.data = {
			  ...config.data,
			  expire_time: useUser.userInfo.expire_time
			};
		  }

		const token = getToken();
		config.headers.Authorization = token;
		return config;
	},
	(error) => {
		return Promise.reject(new Error(error));
	},
);

// 后置拦截器（获取到响应时的拦截）
instance.interceptors.response.use(
	(response) => {
		/**
		 * 根据你的项目实际情况来对 response 和 error 做处理
		 * 这里对 response 和 error 不做任何处理，直接返回
		 */
		const { data } = response;
		if (data.code == 0) {
			return data;
		} else {
			ElMessage.error(response.data.msg);
			return Promise.reject(new Error(response.data.msg));
		}
	},
	async (error) => {
		if (error.response && error.response.data.code == 401) {
			await removeToken();
			ElMessage.error('登录已过期，请重新登录');
			router.push({ path: '/login' });
		}
		error.response && ElMessage.error(error.response.data.msg);
		return Promise.reject(new Error(error.response.data.msg));
	},
);

// 导出常用函数

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export function post(url, data = {}, params = {}) {
	if (data instanceof FormData) {
		data.forEach((value, key) => {
			console.log(key, value);
		});
		return instance({
			method: 'post',
			url,
			data, // FormData 会自动处理 Content-Type
			params,
			headers: { 'Content-Type': 'multipart/form-data' },
		});
	} else {
		// 否则还是继续发送普通的 JSON 数据
		return instance({
			method: 'post',
			url,
			data,
			params,
		});
	}
}

/**
 * @param {string} url
 * @param {object} params
 */
export function get(url, params = {}) {
	return instance({
		method: 'get',
		url,
		params,
	});
}

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export function put(url, data = {}, params = {}) {
	return instance({
		method: 'put',
		url,
		params,
		data,
	});
}

/**
 * @param {string} url
 * @param {object} params
 */
export function _delete(url, params = {}) {
	return instance({
		method: 'delete',
		url,
		params,
	});
}

export default instance;
